package pe.com.bbva.carga.dao.impl;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import org.apache.log4j.Logger;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import pe.com.bbva.carga.dao.ProcesoCargaDAO;
import pe.com.bbva.carga.domain.ProcesoCarga;
import pe.com.bbva.util.Constantes;
import pe.com.stefanini.core.dao.GenericDAOImpl;
import pe.com.stefanini.core.exceptions.BOException;
import pe.com.stefanini.core.exceptions.DAOException;
import pe.com.stefanini.core.util.FechaUtil;
import pe.com.stefanini.core.util.StringUtil;

@Service("procesoCargaDAO")
public class ProcesoCargaDAOImpl extends GenericDAOImpl<ProcesoCarga> implements ProcesoCargaDAO{
	Logger logger = Logger.getLogger(this.getClass());
	
	@Autowired
	public ProcesoCargaDAOImpl(SessionFactory sessionFactory) {
		super(sessionFactory);
	}
	
	@SuppressWarnings("unchecked")
	public List<ProcesoCarga> findProcesosCarga(ProcesoCarga procesoCarga)throws BOException, DAOException {
		String where = "";
		if(procesoCarga.getEquipo()!= null && procesoCarga.getEquipo().getId()!=null){
			where = where + (where==""?"":" AND ") + "equipo = " + procesoCarga.getEquipo().getId();
		}
		if(procesoCarga.getTurno()!= null && procesoCarga.getTurno().getId()!=null){
			where = where + (where==""?"":" AND ") + "turno = " + procesoCarga.getTurno().getId();
		}
		if(procesoCarga.getEstado()!= null && !procesoCarga.getEstado().equals("")){
			where = where + (where==""?"":" AND ") + "estado = '" + procesoCarga.getEstado()+ "'";
		}
		if(procesoCarga.getFechaProceso()!= null && !procesoCarga.getFechaProceso().equals("")){
			where = where + (where==""?"":" AND ") + " to_char(fechaProceso,'dd/mm/yyyy') = '" + FechaUtil.formatFecha(procesoCarga.getFechaProceso(),FechaUtil.DDMMYYYY)+ "'";
		}
		if(procesoCarga.getEstadoFacturacion()!= null && !procesoCarga.getEstadoFacturacion().equals("")){
			where = where + (where==""?"":" AND ") + "estadoFacturacion = '" + procesoCarga.getEstadoFacturacion()+ "'";
		}
		if(procesoCarga.getFormaFacturacion()!= null && !procesoCarga.getFormaFacturacion().equals("")){
			where = where + (where==""?"":" AND ") + "formaFacturacion = '" + procesoCarga.getFormaFacturacion()+ "'";
		}
		if(!where.equals("")){
			where = Constantes.WHERE_CLAUSE + where;
		}
		String orders = " order by fechaCreacion desc";
		List<ProcesoCarga> listaProcesos = super.executeQuery(ProcesoCarga.class,where,orders);
		return listaProcesos;
	}
	
	@SuppressWarnings("unchecked")
	public List<ProcesoCarga> findProcesosCargaRango(ProcesoCarga procesoCarga, String fechaInicio, String fechaFin)throws BOException, DAOException {
		String where = "";
		if(fechaInicio!=null && !fechaInicio.equals("")){
			if(fechaFin!=null && !fechaFin.equals("") && !fechaFin.equals(fechaInicio)){
				where = where + (where==""?"":" AND ") + "fechaProceso BETWEEN to_date('" + fechaInicio + "','dd/mm/yyyy') and to_date('" + fechaFin + "','dd/mm/yyyy')";
			}else{
				where = where + (where==""?"":" AND ") + "to_char(fechaProceso,'dd/mm/yyyy') = '" + fechaInicio + "' ";				
			}
		}
		if(procesoCarga.getEquipo()!= null && procesoCarga.getEquipo().getId()!=null){
			where = where + (where==""?"":" AND ") + "equipo = " + procesoCarga.getEquipo().getId();
		}
		if(procesoCarga.getTurno()!= null && procesoCarga.getTurno().getId()!=null){
			where = where + (where==""?"":" AND ") + "turno = " + procesoCarga.getTurno().getId();
		}
		if(procesoCarga.getEstado()!= null && !procesoCarga.getEstado().equals("")){
			where = where + (where==""?"":" AND ") + "estado = '" + procesoCarga.getEstado()+ "'";
		}
		if(procesoCarga.getEstadoFacturacion()!= null && !procesoCarga.getEstadoFacturacion().equals("")){
			where = where + (where==""?"":" AND ") + "estadoFacturacion = '" + procesoCarga.getEstadoFacturacion()+ "'";
		}
		if(procesoCarga.getFormaFacturacion()!= null && !procesoCarga.getFormaFacturacion().equals("")){
			where = where + (where==""?"":" AND ") + "formaFacturacion = '" + procesoCarga.getFormaFacturacion()+ "'";
		}
		if(!where.equals("")){
			where = Constantes.WHERE_CLAUSE + where;
		}
		String orders = " order by fechaCreacion desc";
		List<ProcesoCarga> listaProcesos = super.executeQuery(ProcesoCarga.class,where,orders);
		return listaProcesos;
	}
	
	@SuppressWarnings("deprecation")
	public Long ValidaCargaEnProceso() throws DAOException {
		Session hibernateSession = null;
		Connection con = null;
		CallableStatement cstmt =null;
		ResultSet rs  = null;		
		Long IdCarga=0L;
		try {
			hibernateSession = (Session) getHibernateTemplate().getSessionFactory().openSession();
			con = hibernateSession.connection();
			cstmt =con.prepareCall("{call TARGPS.PK_TARGPS.PR_VALIDAR_ENPROCESO(?)}");			
			cstmt.registerOutParameter(1,oracle.jdbc.OracleTypes.VARCHAR);		
			cstmt.executeQuery();			
			IdCarga = Long.parseLong((String)cstmt.getObject(1));			
		} catch (HibernateException e) {
			logger.error(StringUtil.getStackTrace(e));
			throw new DAOException(e.getMessage());
		} catch (SQLException e) {
			logger.error(StringUtil.getStackTrace(e));
			throw new DAOException(e.getMessage());
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
			throw new DAOException(e.getMessage());
		}finally{
			try {
				if(rs!=null){
					rs.close();
				}
				if(cstmt!=null){
					cstmt.close();
				}
				hibernateSession.close();
			} catch (SQLException e) {
				logger.error(StringUtil.getStackTrace(e));
				throw new DAOException(e.getMessage());
			} catch (HibernateException e) {
				logger.error(StringUtil.getStackTrace(e));
				throw new DAOException(e.getMessage());
			} 
		}
		return IdCarga;
	}
	
	@SuppressWarnings("deprecation")
	public List<String> consolidarCarga(Long idTurno, String fechaProceso) throws DAOException{
		Session hibernateSession = null;
		Connection con = null;
		CallableStatement cstmt =null;
		ResultSet rs  = null;		
		List<String> archivos = new ArrayList<String>();
		try {
			hibernateSession = (Session) getHibernateTemplate().getSessionFactory().openSession();
			con = hibernateSession.connection();
			cstmt =con.prepareCall("{call TARGPS.PKG_TARGPS.PR_CONSOLIDAR_CARGA(?,?,?)}");			
			cstmt.setString(1, idTurno.toString());
			cstmt.setString(2, fechaProceso);
			cstmt.registerOutParameter(3,oracle.jdbc.OracleTypes.CURSOR);		
			cstmt.executeUpdate();			
			rs = (ResultSet)cstmt.getObject(3);
			if(rs!=null){
				while (rs.next()) {
					String equipo = rs.getString(1);
					archivos.add(equipo);
				}
			}
		} catch (HibernateException e) {
			logger.error(StringUtil.getStackTrace(e));
			throw new DAOException(e.getMessage());
		} catch (SQLException e) {
			logger.error(StringUtil.getStackTrace(e));
			throw new DAOException(e.getMessage());
		} catch (Exception e) {
			logger.error(StringUtil.getStackTrace(e));
			throw new DAOException(e.getMessage());
		}finally{
			try {
				if(rs!=null){
					rs.close();
				}
				if(cstmt!=null){
					cstmt.close();
				}
				hibernateSession.close();
			} catch (SQLException e) {
				throw new DAOException(e.getMessage());
			} catch (HibernateException e) {
				logger.error(StringUtil.getStackTrace(e));
				throw new DAOException(e.getMessage());
			} 
		}
		return archivos;
	}
}